home *** CD-ROM | disk | FTP | other *** search
/ Software of the Month Club 2000 October / Software of the Month - Ultimate Collection Shareware 277.iso / pc / PROGRAMS / UTILITY / WINLINUX / DATA1.CAB / programs_-_usrdoc / KBD-0.95 / AS400.KBD < prev    next >
Text File  |  1999-09-17  |  16KB  |  629 lines

  1. Edward Flottwell <edward@mudhoney.mitropa.com> wrote the following
  2. about his kernel patch for allowing the kernel to work with an
  3. adapted AS400 keyboard.
  4.  
  5. (In fact no kernel patch is required - the utility setkeycodes will do.
  6. But the technical info below might be useful for somebody.)
  7. ----aeb
  8.  
  9. "Keyboard.c patch for IBM Keyboards" (Aug  9, 20:04):
  10.  
  11. > The last 2 Weekends I spent on hacking a little bit in the keyboard code to
  12. > make a keyboard from a IBM AS400 Terminal work with LinuX. It's a very nice
  13. > piece of hardware, 122 keys and 2 kg :-), mostly used in Banks and
  14. > Companies. I got mine from a bank service company for 10 Marks (aprox.
  15. > 7.5$).
  16. > The patch against keyboard.c from 1.3.15 and a README is following:
  17. > --------------------------------schnipp-----------------------------------
  18.  
  19. --- keyboard.1.3.15.orig    Wed Aug  9 12:51:28 1995
  20. +++ keyboard.c    Wed Aug  9 13:11:56 1995
  21. @@ -39,6 +39,11 @@
  22.  #define KBD_REPORT_ERR
  23.  #define KBD_REPORT_UNKN
  24.  /* #define KBD_IS_FOCUS_9000 */
  25. +/* #define KBD_IS_IBM_AS400 */
  26. +
  27. +/* When using an original IBM AS_400 Keyboard you should enable both
  28. + * KBD_IS_FOCUS_9000 and KBD_IS_IBM_AS400
  29. + */
  30.  
  31.  #ifndef KBD_DEFMODE
  32.  #define KBD_DEFMODE ((1 << VC_REPEAT) | (1 << VC_META))
  33. @@ -228,6 +233,29 @@
  34.  
  35.  #define E1_PAUSE   119
  36.  
  37. +#ifdef KBD_IS_IBM_AS400 
  38. +#define E0_GR      105
  39. +#define E0_SIGN    43
  40. +#define E0_LINE    108
  41. +#define IBM_PF9    112
  42. +#define IBM_PF10   113
  43. +#define IBM_PF11   114
  44. +#define IBM_PF12   115
  45. +#define IBM_PF13   116
  46. +#define IBM_PF14   117
  47. +#define IBM_PF15   118
  48. +#define IBM_PF16   120
  49. +#define IBM_PF17   121
  50. +#define IBM_PF18   122
  51. +#define IBM_PF19   123
  52. +#define IBM_PF20   124
  53. +#define IBM_PF21   125
  54. +#define IBM_PF22   126
  55. +#define IBM_PF23   127
  56. +#define IBM_PF24   119
  57. +#endif
  58. +
  59. +
  60.  /*
  61.   * The keycodes below are randomly located in 89-95,112-118,120-127.
  62.   * They could be thrown away (and all occurrences below replaced by 0),
  63. @@ -262,6 +290,7 @@
  64.  #define RGN3 126
  65.  #define RGN4 127
  66.  
  67. +#ifndef KBD_IS_IBM_AS400
  68.  static unsigned char high_keys[128 - SC_LIM] = {
  69.    RGN1, RGN2, RGN3, RGN4, 0, 0, 0,                   /* 0x59-0x5f */
  70.    0, 0, 0, 0, 0, 0, 0, 0,                            /* 0x60-0x67 */
  71. @@ -270,6 +299,20 @@
  72.    FOCUS_PF4, FOCUS_PF5, FOCUS_PF6, FOCUS_PF7,        /* 0x78-0x7b */
  73.    FOCUS_PF8, JAP_86, FOCUS_PF10, 0                   /* 0x7c-0x7f */
  74.  };
  75. +#endif
  76. +#ifdef KBD_IS_IBM_AS400
  77. +static unsigned char high_keys[128 - SC_LIM] = {
  78. +  FOCUS_PF2, FOCUS_PF3, FOCUS_PF4, FOCUS_PF5, FOCUS_PF6,
  79. +  FOCUS_PF7, FOCUS_PF8,          /* 0x59-0x5f */
  80. +  IBM_PF9, IBM_PF10, IBM_PF11, IBM_PF12,
  81. +  IBM_PF13, IBM_PF14, IBM_PF15, IBM_PF16,    /* 0x60-0x67 */
  82. +  IBM_PF17, IBM_PF18, IBM_PF19, IBM_PF20, IBM_PF21, 
  83. +  IBM_PF22, IBM_PF23, E0_PGUP, /* 0x68-0x6f */
  84. +  E0_GR, E0_RCTRL, E0_RALT, 0, E0_SIGN, 0, IBM_PF24, E0_LINE, /* 0x70-0x77 */
  85. +  E0_UP, E0_DEL, E0_END, E0_INS,        /* 0x78-0x7b */
  86. +  0, E0_RIGHT, E0_PGDN, E0_HOME                /* 0x7c-0x7f */
  87. +};
  88. +#endif
  89.  
  90.  /* BTC */
  91.  #define E0_MACRO   112
  92.  
  93. --------------------------------schnipp-----------------------------------
  94.  
  95. This is an explaining README.  ( README.AS400 )
  96.  
  97. --------------------------------schnipp-----------------------------------
  98.  
  99.     Connecting and using a non standard IBM keyboard
  100.  
  101.                 by 
  102.             Edward von Flottwell 
  103.              edward@mudhoney.mitropa.com
  104.  
  105. If you would like to use an old IBM 122-key AS400 Terminal keyboard with Linux,
  106. you should to do some small things:
  107.  
  108. 1. Get your 'new' keyboard from a recycling company. 
  109.    If you haven't done this already :-)
  110. 2. Solder a new 5pin DIN Connector instead of the RJ/??? Plug to the wire.
  111. 3. Patch the kernel and build an new one.
  112. 4. Load a new keymap and fit it to your needs.
  113.  
  114. I hope you managed the first step - so I'll continue with the second one:
  115. Get a keyboard connector from your nearest electronic-shop, cut off the
  116. original plug and you will hopefully find 4 colored wires: black, red,
  117. yellow and white. Connect them in the following way with the DIN Plug:
  118.  
  119.     Wire    Signal    DIN      ___    
  120.     Black    +5V    4     / 3 \  Soldering
  121.     White    GND    2    (2   4)    View
  122.     Red    Data    3     \1^5/
  123.     Yellow    Clock    1      
  124.             
  125. BUT BE VERY CAREFUL!!! Connecting the wrong signals can damage or blow up 
  126. your keyboard or your mainboard! The table above comes with NO warranty,
  127. because I don't believe IBM always use the same type of cable :-}
  128. You should open the keyboard and trace the wires to find the matching out.
  129. And you should consult your mainboard for the keyboard-plug layout!
  130.  
  131. Now you're ready to switch on the computer... Some mainboard bioses will
  132. produce a keyboard error. You can ignore this :-) BTW the F1 key is the 
  133. very left of the function-key group near the tabulator key.
  134. O.K., now you can try to type something, e.g. LILO: linux :-)
  135. You will find out that some keys are swapped, others are dead. To make all
  136. of the keys work apply the kernel-patch to 
  137. /usr/src/linux/drivers/char/keyboard.c and comment the lines with
  138.  
  139. /* #define KBD_IS_FOCUS_9000 */
  140. /* #define KBD_IS_IBM_AS400 */
  141.  
  142. out. Recompile and install the new kernel.
  143.  
  144. Now you need the last missing part: the keymap. At the end of this README
  145. you will find an example for German users. How to make it fit to your
  146. national keyboard is explained in the Keystroke-HOWTO. Most other questions 
  147. about keymaps, scancodes,... are explained there, too. 
  148. I would also suggest you read the manpages of showkey and loadkeys. 
  149. Don't forget to load the keymap every time you boot, 
  150. I prefer the rc.local shellscript doing this for me :-)
  151.  
  152. The keymap:
  153.  
  154. #
  155. # File:        AS400.map
  156. #
  157.  
  158. keycode   0 =
  159. keycode   1 = Escape           Escape
  160.     alt     keycode   1 = Meta_Escape
  161.     shift alt keycode 1 = Meta_Escape
  162.  
  163. keycode   2 = one              exclam
  164.     alt     keycode   2 = Meta_one
  165.     shift alt keycode 2 = Meta_exclam
  166.  
  167. keycode   3 = two              quotedbl         twosuperior
  168.     control keycode   3 = nul
  169.     alt     keycode   3 = Meta_two
  170.     shift alt keycode 3 = Meta_quotedbl
  171.  
  172. keycode   4 = three            section          threesuperior
  173.     control keycode   4 = Escape
  174.     alt     keycode   4 = Meta_three
  175.  
  176. keycode   5 = four             dollar           dollar
  177.     control keycode   5 = Control_backslash
  178.     alt     keycode   5 = Meta_four
  179.     shift alt keycode 5 = Meta_dollar
  180.     
  181. keycode   6 = five             percent
  182.     control keycode   6 = Control_bracketright
  183.     alt     keycode   6 = Meta_five
  184.     shift alt keycode 6 = Meta_percent
  185.        
  186. keycode   7 = six              ampersand
  187.     control keycode   7 = Control_asciicircum
  188.     alt     keycode   7 = Meta_six
  189.     shift alt keycode 7 = Meta_ampersand
  190.  
  191. keycode   8 = seven            slash            braceleft
  192.     control keycode   8 = Control_underscore
  193.     alt     keycode   8 = Meta_seven
  194.     shift alt keycode 8 = Meta_slash
  195.   
  196. keycode   9 = eight            parenleft        bracketleft
  197.     control keycode   9 = Delete
  198.     alt     keycode   9 = Meta_eight
  199.     shift alt keycode 9 = Meta_parenleft
  200.  
  201. keycode  10 = nine             parenright       bracketright
  202.     alt     keycode  10 = Meta_nine
  203.      control altgr keycode 10 = Control_bracketright
  204.     shift alt keycode 10 = Meta_parenright
  205.  
  206. keycode  11 = zero             equal            braceright
  207.     alt     keycode  11 = Meta_zero
  208.     shift alt keycode 11 = Meta_equal
  209.  
  210. keycode  12 = ssharp           question         backslash
  211.     control keycode  12 = Control_underscore
  212.     alt     keycode  12 = Meta_minus
  213.      control altgr keycode  12 = Control_backslash
  214.     shift alt keycode 12 = Meta_question
  215.     alt altgr keycode 12 = Meta_backslash
  216.  
  217. keycode  13 = apostrophe       grave
  218.     alt     keycode  13 = Meta_equal
  219.     shift alt keycode 13 = Meta_grave
  220.  
  221. keycode  14 = Delete           Delete
  222.     alt     keycode  14 = Meta_Delete
  223.  
  224. keycode  15 = Tab              Tab
  225.     alt     keycode  15 = Meta_Tab
  226.  
  227. keycode  16 = q
  228.     altgr    keycode 16 = at
  229.     control keycode 16 = Control_q
  230.     alt    keycode 16 = Meta_q
  231.     shift alt keycode 16 = Meta_Q
  232.     altgr    alt    keycode 16 = Meta_at
  233.  
  234. keycode  17 = w
  235.     control keycode 17 = Control_w
  236.     alt    keycode 17 = Meta_w
  237.     shift alt keycode 17 = Meta_W
  238.  
  239. keycode  18 = e
  240.     control keycode 18 = Control_e
  241.     alt    keycode 18 = Meta_e
  242.     shift alt keycode 18 = Meta_E
  243.  
  244. keycode  19 = r
  245.     control keycode 19 = Control_r
  246.     alt    keycode 19 = Meta_r
  247.     shift alt keycode 19 = Meta_R
  248.  
  249. keycode  20 = t
  250.     control keycode 20 = Control_t
  251.     alt    keycode 20 = Meta_t
  252.     shift alt keycode 20 = Meta_T
  253.  
  254. keycode  21 = z
  255.     control keycode 21 = Control_z
  256.     alt    keycode 21 = Meta_z
  257.     shift alt keycode 21 = Meta_Z
  258.  
  259. keycode  22 = u
  260.     control keycode 22 = Control_u
  261.     alt    keycode 22 = Meta_u
  262.     shift alt keycode 22 = Meta_U
  263.  
  264. keycode  23 = i
  265.     alt    keycode 23 = Meta_i
  266.     shift alt keycode 23 = Meta_I
  267.  
  268. keycode  24 = o
  269.     control keycode 24 = Control_o
  270.     alt    keycode 24 = Meta_o
  271.     shift alt keycode 24 = Meta_O
  272.  
  273. keycode  25 = p
  274.     control keycode 25 = Control_p
  275.     alt    keycode 25 = Meta_p
  276.     shift alt keycode 25 = Meta_P
  277.  
  278. keycode  26 = +udiaeresis       +Udiaeresis
  279.     control keycode  26 = Escape
  280.     alt     keycode  26 = Meta_bracketleft
  281.     shift alt keycode 26 = Meta_braceleft
  282.  
  283. keycode  27 = plus             asterisk         asciitilde
  284.     control keycode  27 = Control_bracketright
  285.     alt     keycode  27 = Meta_bracketright
  286.     shift alt keycode 27 = Meta_braceright
  287.  
  288. keycode  28 = Return
  289.     alt     keycode  28 = 0x080d
  290.  
  291. keycode  29 = Caps_Lock
  292.  
  293. keycode  30 = a
  294.     control keycode 30 = Control_a
  295.     alt    keycode 30 = Meta_a
  296.     shift alt keycode 30 = Meta_A
  297.  
  298. keycode  31 = s
  299.     control keycode 31 = Control_s
  300.     alt    keycode 31 = Meta_s
  301.     shift alt keycode 31 = Meta_S
  302.  
  303. keycode  32 = d
  304.     control keycode 32 = Control_d
  305.     alt    keycode 32 = Meta_d
  306.     shift alt keycode 32 = Meta_D
  307.  
  308. keycode  33 = f
  309.     control keycode 33 = Control_f
  310.     alt    keycode 33 = Meta_f
  311.     shift alt keycode 33 = Meta_F
  312.  
  313. keycode  34 = g
  314.     control keycode 34 = Control_g
  315.     alt    keycode 34 = Meta_g
  316.     shift alt keycode 34 = Meta_G
  317.  
  318. keycode  35 = h
  319.     alt    keycode 35 = Meta_h
  320.     shift alt keycode 35 = Meta_H
  321.  
  322. keycode  36 = j
  323.     alt    keycode 36 = Meta_j
  324.     shift alt keycode 36 = Meta_J
  325.  
  326. keycode  37 = k
  327.     control keycode 37 = Control_k
  328.     alt    keycode 37 = Meta_k
  329.     shift alt keycode 37 = Meta_K
  330.  
  331. keycode  38 = l
  332.     control keycode 38 = Control_l
  333.     alt    keycode 38 = Meta_l
  334.     shift alt keycode 38 = Meta_L
  335.  
  336. keycode  39 = +odiaeresis       +Odiaeresis
  337.     alt     keycode  39 = Meta_semicolon
  338.     shift alt keycode 39 = Meta_colon
  339.     shift keycode  39 = Odiaeresis
  340.  
  341. keycode  40 = +adiaeresis       +Adiaeresis
  342.     control keycode  40 = Control_g
  343.     alt     keycode  40 = Meta_apostrophe
  344.     shift alt keycode 40 = Meta_quotedbl
  345.  
  346. keycode  41 = asciicircum  degree
  347.     control keycode  41 = nul
  348.     alt     keycode  41 = Meta_grave
  349.     shift alt keycode 41 = Meta_asciitilde
  350.  
  351. keycode  42 = Shift
  352.  
  353. keycode  43 = numbersign       apostrophe
  354.     control keycode  43 = Control_backslash
  355.     alt     keycode  43 = Meta_backslash
  356.     shift alt keycode 43 = Meta_apostrophe
  357.  
  358. keycode  44 = y
  359.     control keycode 44 = Control_y
  360.     alt    keycode 44 = Meta_y
  361.     shift alt keycode 44 = Meta_Y
  362.  
  363. keycode  45 = x
  364.     control keycode 45 = Control_x
  365.     alt    keycode 45 = Meta_x
  366.     shift alt keycode 45 = Meta_X
  367.  
  368. keycode  46 = c
  369.     control keycode 46 = Control_c
  370.     alt    keycode 46 = Meta_c
  371.     shift alt keycode 46 = Meta_C
  372.  
  373. keycode  47 = v
  374.     control keycode 47 = Control_v
  375.     alt    keycode 47 = Meta_v
  376.     shift alt keycode 47 = Meta_V
  377.  
  378. keycode  48 = b
  379.     control keycode 48 = Control_b
  380.     alt    keycode 48 = Meta_b
  381.     shift alt keycode 48 = Meta_B
  382.  
  383. keycode  49 = n
  384.     control keycode 49 = Control_n
  385.     alt    keycode 49 = Meta_n
  386.     shift alt keycode 49 = Meta_N
  387.  
  388. keycode  50 = m
  389.     altgr    keycode 50 = mu
  390.     control keycode 50 = Control_m
  391.     alt    keycode 50 = Meta_m
  392.     shift alt keycode 50 = Meta_M
  393.  
  394. keycode  51 = comma            semicolon
  395.     alt     keycode  51 = Meta_comma
  396.     alt shift keycode 51 = Meta_semicolon
  397.  
  398. keycode  52 = period           colon
  399.     alt     keycode  52 = Meta_period
  400.     alt shift keycode 21 = Meta_colon
  401.  
  402. keycode  53 = minus            underscore
  403.     control keycode  53 = Delete
  404.     alt     keycode  53 = Meta_slash
  405.     shift control keycode 53 = Control_underscore
  406.  
  407. keycode  54 = Shift
  408.  
  409. keycode  55 = KP_Multiply
  410.  
  411. keycode  56 = Control
  412.      
  413. keycode  57 = space            space
  414.     control keycode  57 = nul
  415.     alt     keycode  57 = Meta_space
  416.  
  417. keycode 58 = Control
  418.  
  419. keycode  59 = Escape           Escape
  420.     alt     keycode   1 = Meta_Escape
  421.     shift alt keycode 1 = Meta_Escape
  422.  
  423. keycode  60 = Control_z
  424.  
  425. keycode  61 = 
  426.  
  427. keycode  62 = Last_Console
  428.  
  429. keycode  63 = Control_a
  430.  
  431. keycode  64 = Up
  432.  
  433. keycode  65 = Control_backslash
  434.     control keycode  99 = Control_backslash
  435.     alt     keycode  99 = Control_backslash
  436.  
  437. keycode  66 = Control_c
  438.  
  439. keycode  67 = Control_q
  440.  
  441. keycode  68 = Control_s
  442.  
  443. keycode  69 = Num_Lock
  444.  
  445. keycode  70 = Control_r
  446.  
  447. keycode  71 = KP_7
  448.     alt     keycode  71 = Ascii_7
  449.  
  450. keycode  72 = KP_8
  451.     alt     keycode  72 = Ascii_8
  452.  
  453. keycode  73 = KP_9
  454.     alt     keycode  73 = Ascii_9
  455.  
  456. keycode  74 = KP_Subtract
  457.  
  458. keycode  75 = KP_4
  459.     alt     keycode  75 = Ascii_4
  460.  
  461. keycode  76 = KP_5
  462.     alt     keycode  76 = Ascii_5
  463.  
  464. keycode  77 = KP_6
  465.     alt     keycode  77 = Ascii_6
  466.  
  467. keycode  78 = KP_Enter
  468.  
  469. keycode  79 = KP_1
  470.     alt     keycode  79 = Ascii_1
  471.  
  472. keycode  80 = KP_2
  473.     alt     keycode  80 = Ascii_2
  474.  
  475. keycode  81 = KP_3
  476.     alt     keycode  81 = Ascii_3
  477.  
  478. keycode  82 = KP_0
  479.     alt     keycode  82 = Ascii_0
  480.  
  481. keycode  83 = KP_Comma
  482.     altgr   control keycode  83 = Boot
  483.     control alt     keycode  83 = Boot
  484.  
  485. keycode  84 = slash
  486.  
  487. keycode  85 = Down
  488.  
  489. keycode  86 = Left
  490.  
  491. keycode  87 = F11              F11              Console_23
  492.     control keycode  87 = F11
  493.     alt     keycode  87 = Console_11
  494.     control    alt     keycode  87 = Console_11
  495.  
  496. keycode  88 = F1               F11              Console_13
  497.     control keycode  88 = F1
  498.     alt     keycode  88 = Console_1
  499.     control    alt     keycode  88 = Console_1
  500.  
  501. keycode  89 = F2               F12              Console_14
  502.     control keycode  89 = F2
  503.     alt     keycode  89 = Console_2
  504.     control    alt     keycode  89 = Console_2
  505.  
  506. keycode  90 = F3               F13              Console_15
  507.     control keycode  90 = F3
  508.     alt     keycode  90 = Console_3
  509.     control    alt     keycode  90 = Console_3
  510.  
  511. keycode  91 = F4               F14              Console_16
  512.     control keycode  91 = F4
  513.     alt     keycode  91 = Console_4
  514.     control    alt     keycode  91 = Console_4
  515.  
  516. keycode  92 = F5               F15              Console_17
  517.     control keycode  92 = F5
  518.     alt     keycode  92 = Console_5
  519.     control    alt     keycode  92 = Console_5
  520.  
  521. keycode  93 = F6               F16              Console_18
  522.     control keycode  93 = F6
  523.     alt     keycode  93 = Console_6
  524.     control    alt     keycode  93 = Console_6
  525.  
  526. keycode  94 = F7               F17              Console_19
  527.     control keycode  94 = F7
  528.     alt     keycode  94 = Console_7
  529.     control    alt     keycode  94 = Console_7
  530.  
  531. keycode  95 = F8               F18              Console_20
  532.     control keycode  95 = F8
  533.     alt     keycode  95 = Console_8
  534.     control    alt     keycode  95 = Console_8
  535.  
  536. keycode  96 = KP_Enter
  537.  
  538. keycode  97 = Alt
  539.  
  540. keycode  98 = KP_Divide
  541.  
  542. keycode  99 = 
  543.  
  544. keycode 100 = AltGr
  545.  
  546. keycode 101 = Break
  547.  
  548. keycode 102 = Find
  549.  
  550. keycode 103 = Up
  551.  
  552. keycode 104 = Prior
  553.     shift   keycode 104 = Scroll_Backward
  554.  
  555. keycode 105 = less    greater        bar
  556.      alt     keycode  86 = Meta_less
  557.      shift alt keycode  86 = Meta_greater
  558.     altgr alt keycode  86 = Meta_bar
  559.  
  560. keycode 106 = Right
  561.  
  562. keycode 107 = Select
  563.  
  564. keycode 108 = F25
  565.  
  566. keycode 109 = Next            
  567.     shift   keycode 109 = Scroll_Forward  
  568.  
  569. keycode 110 = Insert          
  570.  
  571. keycode 111 = Remove          
  572.     altgr   control keycode 111 = Boot            
  573.     control alt     keycode 111 = Boot            
  574.  
  575. keycode 112 = F9
  576. keycode 113 = F10
  577. keycode 114 = F11
  578. keycode 115 = F12
  579. keycode 116 = Console_1
  580. keycode 117 = Console_2
  581. keycode 118 = Console_3
  582. keycode 119 = 
  583. keycode 120 = Console_4
  584. keycode 121 = Console_5
  585. keycode 122 = Console_6
  586. keycode 123 = Console_7
  587. keycode 124 = Console_8
  588. keycode 125 = F21
  589. keycode 126 = F22
  590. keycode 127 = F23
  591.  
  592. # mom
  593. string F1 = "\033[[A"
  594. string F2 = "\033[[B"
  595. string F3 = "\033[[C"
  596. string F4 = "\033[[D"
  597. string F5 = "\033[[E"
  598. string F6 = "\033[17~"
  599. string F7 = "\033[18~"
  600. string F8 = "\033[19~"
  601. string F9 = "\033[20~"
  602. string F10 = "\033[21~"
  603. string F11 = "\033[23~"
  604. string F12 = "\033[24~"
  605. string F13 = "\033[25~"
  606. string F14 = "\033[26~"
  607. string F15 = "\033[28~"
  608. string F16 = "\033[29~"
  609. string F17 = "\033[31~"
  610. string F18 = "\033[32~"
  611. string F19 = "\033[33~"
  612. string F20 = "\033[34~"
  613. string Find = "\033[1~"
  614. string Insert = "\033[2~"
  615. string Remove = "\033[3~"
  616. string Select = "\033[4~"
  617. string Prior = "\033[5~"
  618. string Next = "\033[6~"
  619. string F21 = ""
  620. string F22 = ""
  621. string F23 = ""
  622. string F24 = ""
  623. string F25 = ""
  624. string F26 = ""
  625.  
  626.  
  627.